from typing import Iterator

from langchain_core.document_loaders import BaseBlobParser  # 基于 Blob 的解析器基类
from langchain_core.documents import Document               # 文档对象
from langchain_core.documents.base import Blob              # Blob 对象，表示“原始数据块”

# ==============================
# 自定义解析器
# ==============================
class MyParser(BaseBlobParser):
    """
    一个简单示例：将 Blob 中的内容逐行解析为 Document
    - Blob 可以表示文件、内存数据等“二进制数据块”
    - Parser 的作用是把原始数据块解析成 Document，供 RAG 系统使用
    """

    def lazy_parse(self, blob: Blob) -> Iterator[Document]:
        """
        同步惰性解析方法
        Args:
            blob: Blob 对象，包含原始数据
        Returns:
            Document 生成器，每个 Document 对应一行数据
        """
        line_number = 0
        # blob.as_bytes_io() 返回一个类文件对象，可以像读取文件一样读取 Blob 数据
        with blob.as_bytes_io() as f:
            for line in f:  # 逐行读取
                line_number += 1
                # 生成 Document
                yield Document(
                    page_content=line,  # 文本内容
                    metadata={
                        "line_number": line_number,  # 行号
                        "source": blob.source        # 数据来源（文件路径或描述）
                    },
                )

# ==============================
# 测试 Blob: 从文件创建
# ==============================
blob = Blob.from_path("/meow.txt", encoding="utf-8")  # 从文件路径创建 Blob
parser = MyParser()                                  # 初始化自定义解析器
print(list(parser.lazy_parse(blob)))                 # 解析结果转换为列表并打印

# ==============================
# 测试 Blob: 从内存数据创建
# ==============================
# 这里直接用 bytes 数据创建 Blob，模拟内存数据
blob = Blob(
    data="来自内存的一直猫\n喵喵".encode("utf-8"),  # bytes 类型
    encoding="utf-8"
)

### blob 属性
print(blob.encoding)
print(blob.as_bytes())
print(blob.as_string())
print(blob.as_bytes_io())
print(list(parser.lazy_parse(blob)))  # 解析结果转换为列表并打印
